﻿
/*-------------------------------------------------
 * 
 * LiMeLanguage MainCode.
 * Latest Update 2011-4-30.
 * 
 * ...コメント処理の実装終了。
 * ...関数ごとに文をclassに分ける？
 * 
 * Edit By Swallow.
 * 
---------------------------------------------------*/



using System;
using System.Data;
using System.Collections.Generic;
using System.Text.RegularExpressions;


#region テスト呼び出し
class Test
{
    static public void Main()
    {
        using (System.IO.StreamReader sr = new System.IO.StreamReader("test.ltm"))
        {
            LiMeLanguage tm = new LiMeLanguage(sr.ReadToEnd());
            tm.MainProc();

            Console.WriteLine("TagMirror Procces End... Press Any Key");
            Console.Read();
        }
    }
}
#endregion



class LiMeLanguage
{
    #region コード系変数
    private string Code = "";//コード
    private List<Expression> CodeTokens = new List<Expression>(); //文の区切りのList
    #endregion

    #region コンストラクタ&コメント処理
    public LiMeLanguage(string SourceCode)
    {
        Code = SourceCode.Replace("\t","");//タブ文字を削除

        Init.Comment.DeleteComment(ref Code);//コメントの消去
    }

    
    #endregion

    #region Core(各関数呼び出し)
    public void MainProc()
    {
        if (Code == null){throw new NotCodeException("コードが空です。"); }
        this.Parse();
    }
    #endregion

    #region 構文解析
    private void Parse()
    {
        //二個以上連続している空白を削除
        #region 初期処理
        /*余分な空白を切除*/
        Code = Regex.Replace(Code, "[ ]+", " ");
        /***********
         * 空白で切り分ける。
        ************/
        string[] SpaceSplit = Code.Split(' ');
        #endregion

        #region debug

        /*Debug*/
        Console.WriteLine("[Queue::Parse::SpaceDel]"+Code);
        #endregion
        
        #region 文ごとに分ける
        /***********
         * 文ごとにCodeTokensのListに入れる
        ************/
        int Count = 0; //List用変数
        CodeTokens.Add(new Expression());
        foreach (string Word in SpaceSplit)
        {
            if (Word == "") continue;

            if (Word == ";") //文の終わりだったら
            {
                CodeTokens.Add(new Expression());
                 Count++;
            }
            else //文の途中なら
            {
                CodeTokens[Count].TokenList.Add(Word);
            }
        }
        #endregion

        #region debug

        /*Debug*/
        Console.WriteLine("[Queue::Parse::Split::Step1]");
        int co = 0;
        foreach (Expression e in CodeTokens)
        {
            Console.WriteLine("\t[{0} - TokenList]", co);
            string[] debug = e.TokenList.ToArray();
            foreach (string d in debug)
            {
                Console.Write("\t\t" + d + "\n");
            }
            co++;
        }
        #endregion

        Split.AtMark.Split(ref CodeTokens);//アットマークの切り分け(関数宣言記号)

        #region debug

        /*Debug*/
        Console.WriteLine("[Queue::Parse::Split::Step2]");
        int cosss = 0;
        foreach (Expression e in CodeTokens)
        {
            Console.WriteLine("\t[{0} - TokenList]", cosss);
            string[] debug = e.TokenList.ToArray();
            foreach (string d in debug)
            {
                Console.Write("\t\t" + d + "\n");
            }
            cosss++;
        }
        #endregion

        Split.Dollar.Split(ref CodeTokens);//ドルマークの切り分け(関数呼び出し記号)

        #region debug
        Console.WriteLine("[Queue::Parse::Split::Step3]");
        cosss = 0;
        foreach (Expression e in CodeTokens)
        {
            Console.WriteLine("\t[{0} - TokenList]", cosss);
            string[] debug = e.TokenList.ToArray();
            foreach (string d in debug)
            {
                Console.Write("\t\t" + d + "\n");
            }
            cosss++;
        }
        #endregion

        
    }
    #endregion

}
